#pragma once
#include "../variant.h"
#include "approximatedosfunctor.h"
#include <armadillo>

#ifdef GRAPHENETOOLS_EXPORTS
#ifndef GRAPHENETOOLS_DLL_API
#define GRAPHENETOOLS_DLL_API __declspec(dllexport)
#endif
#else
#ifndef GRAPHENETOOLS_DLL_API
#define GRAPHENETOOLS_DLL_API __declspec(dllimport)
#endif
#endif
class GRAPHENETOOLS_DLL_API DoSFunctor
{
	ApproximateDoSFunctor approxDoSFunc;
	enum methodtype {
		defaultmethod,
		haydockmethod,
		directmethod
	} method;
	
	static const string haydocksymbol;
	static const string directsymbol;

	static const string methodsymbol;
public:
	DoSFunctor(System* s, const rule::list &opts = rule::list());

	
	complex getGreensFunctionValue(int id, complex energy);
	double getDoSValue(int id, double energy);
	arma::mat getDoS(int id, numeric::range energies);
};

